home *** CD-ROM | disk | FTP | other *** search
- /* $VER: Inf.e 2.51 (29.04.95) ©1995 Michael Askin
- ** A small program to show how much space is left on a volume in
- ** bytes. This time the program internals are all in bytes.
- **
- ** 2.51 (29.04.95) - Fixed bug if no device name on arg
- ** Took out spaces in QUIET
- ** 2.5 (20.03.95) - Added Multiple device names
- ** (06.04.95) - Only takes first dev name when WIN flag is on.
- **
- ** 2.4 (8.2.95) - Printing numbers with comma's
- ** - Watch (was seperate program)
- ** - Window (was seperate program)
- ** - Font sensitivity
- ** - Opening on public screens
- */
-
- MODULE 'dos/dos','intuition/intuition','intuition/screens'
-
- CONST BYTESCUTOFF=102400, KBYTESCUTOFF=8192
-
- ENUM ARG_DEVICES,ARG_WB,ARG_BYTE,ARG_KILO,ARG_WATCH,ARG_WINDOW,ARG_SCREEN,ARG_QUIET
-
- ENUM ER_NONE, ER_LOCK, ER_INFO, ER_ARGS, ER_WIN, ER_PUBSCREEN, ER_BREAK
-
- /* Set common errors. Automatically calls the exception handler. */
- RAISE ER_LOCK IF Lock()=NIL,
- ER_INFO IF Info()=NIL,
- ER_WIN IF OpenWindowTagList()=NIL,
- ER_PUBSCREEN IF LockPubScreen()=NIL,
- ER_BREAK IF CtrlC()=TRUE
-
- DEF info:infodata /* Holds the info about the disk */
- DEF args:PTR TO LONG /* Holds the arguments */
- DEF ver[150]:STRING
-
- PROC main() HANDLE
- DEF lock=0, rdargs=0, win:window, port, scr:screen, screenname[30]:STRING
- DEF temp[80]:STRING, device[250]:STRING, watch, window, nodev_flag=FALSE
- DEF devices:PTR TO LONG, i=0
- DEF argstr[200]:STRING
- StrCopy(ver,'$VER:Inf 2.51 (29.04.95) ©1995 Michael Askin',ALL)
- StringF(argstr,'\s\nDEVICES/M,WB/S,B=BYTES/S,KB=KILO/S,W=WATCH/S,WIN=WINDOW/S,PS=PUBLICSCREEN/K,QUIET/S',ver+5)
- args:=[0,0,0,0,0,0,0,0] ; win:=NIL ; scr:=NIL
- /* Do I need the next line? */
- /* devices:=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]*/
-
- IF (rdargs:=ReadArgs(argstr,args,NIL))=NIL THEN Raise(ER_ARGS)
-
- IF args[ARG_DEVICES]<>NIL
- devices:=args[ARG_DEVICES]
- ELSE
- devices:=['',0]
- ENDIF
-
- IF args[ARG_SCREEN]<>NIL THEN StrCopy(screenname,args[ARG_SCREEN],ALL) ELSE screenname:=NIL
-
- IF args[ARG_WATCH]=TRUE THEN watch:=TRUE ELSE watch:=FALSE
-
- IF args[ARG_WINDOW]=TRUE THEN window:=TRUE
- IF wbmessage<>0
- window:=TRUE
- ELSE
- IF (args[ARG_QUIET]=FALSE) AND (args[ARG_WINDOW]=FALSE)
- WriteF('\s\n',ver+5)
- ENDIF
- ENDIF
-
- WHILE (nodev_flag=FALSE)
-
- IF devices[i]<>NIL
- StrCopy(device,devices[i],ALL)
- ELSEIF (i=0)
- StrCopy(device,'',ALL)
- nodev_flag:=TRUE
- ELSE
- /*WriteF('Good Bye\n')*/
- Raise(ER_NONE)
- ENDIF
-
- INC i
-
- CtrlC()
-
- /* Find actual name of volume */
- getdevname(device)
-
- lock:=Lock(device,SHARED_LOCK) /* Lock the disk */
-
- IF window=TRUE
- watch:=TRUE
-
- /* Open a window on a pub screen if pos */
- scr:=LockPubScreen(screenname)
- win:=OpenWindowTagList(0,
- [WA_LEFT,640-501,
- WA_TOP,0,
- WA_WIDTH,500,
- WA_HEIGHT,scr.barheight+1,
- WA_IDCMP, IDCMP_CLOSEWINDOW+IDCMP_VANILLAKEY,
- WA_FLAGS,WFLG_CLOSEGADGET+WFLG_DRAGBAR+WFLG_DEPTHGADGET+WFLG_RMBTRAP,
- WA_PUBSCREEN, scr,
- 0,0])
- /* To make sure we don't keep opening more windows for the other */
- /* device names we make sure we only look at the first dev on */
- /* list, by setting the nodev flag. */
- nodev_flag:=TRUE
- ELSE
- win:=NIL
- ENDIF
-
- IF win<>NIL THEN port:=win.userport /* Any port in a storm! */
-
- REPEAT /* So that even if watch=FALSE, we will get 1 trip */
-
- Info(lock,info) /* Get the info */
-
- /* Print the results */
- showsize(device,win)
-
- IF (window=TRUE OR args[ARG_WATCH]=TRUE)
- Delay(10)
- ENDIF
-
- IF CtrlC()=TRUE THEN watch:=FALSE
- IF win<>NIL THEN IF GetMsg(port)<>0 THEN watch:=FALSE
-
- UNTIL watch=FALSE
- IF win=NIL THEN WriteF('\n')
- ENDWHILE
-
- Raise(ER_NONE)
-
- EXCEPT
-
- IF lock THEN UnLock(lock)
- IF rdargs THEN FreeArgs(rdargs)
- IF win THEN CloseWindow(win)
- IF scr THEN UnlockPubScreen(NIL,scr)
-
- SELECT exception
- CASE ER_NONE
- CASE ER_LOCK ; WriteF('Could not find device "\s"\n',device)
- CASE ER_INFO ; WriteF('Could not get info from "\s"\n',device)
- CASE ER_ARGS ; WriteF('Bad Args. Inf ? for help\n')
- CASE ER_WIN ; WriteF('Could not open window!\n')
- CASE ER_PUBSCREEN ; WriteF('Could not find public screen!\n')
- CASE ER_BREAK ; WriteF('\n***Break\n')
- DEFAULT ; WriteF('Unknown Error \d\n',exception)
- ENDSELECT
- ENDPROC
-
- PROC showsize(dev,win:PTR TO window)
- DEF size, used, free, freeper
- DEF sizeunits[8]:STRING, usedunits[8]:STRING, freeunits[8]:STRING
- DEF freestring[10]:STRING, usedstring[10]:STRING, sizestring[10]:STRING
- DEF output[100]:STRING, diskstate[40]:STRING, ds=0
-
- /* Full size of unit in bytes */
- size:=Mul(info.numblocks,info.bytesperblock)
-
- /* Used Bytes */
-
- used:=Mul(info.numblocksused,info.bytesperblock)
-
- /* Amount of free bytes */
- free:=size-used
-
- /* Calculate the percentage */
- freeper:=percentage(free,size)
-
- IF args[ARG_QUIET]<>TRUE
- size:=doconversion(size,sizeunits)
- free:=doconversion(free,freeunits)
- used:=doconversion(used,usedunits)
- ENDIF
-
- commanumber(used,usedstring)
- commanumber(free,freestring)
- commanumber(size,sizestring)
-
- /* This bit works out just what the diskstate is */
- ds:=info.diskstate
- SELECT ds
- CASE ID_WRITE_PROTECTED ; StrCopy(diskstate,'Write Protected',ALL)
- CASE ID_VALIDATING ; StrCopy(diskstate,'Not Validated',ALL)
- CASE ID_VALIDATED ; StrCopy(diskstate,'OK',ALL)
- ENDSELECT
-
- IF args[ARG_QUIET]<>TRUE
- IF args[ARG_WB]=TRUE
- StringF(output,'\s \d% full, \s\s free, \s\s in use',dev,100-freeper,freestring,freeunits,usedstring,usedunits)
- ELSE
- StringF(output,'"\s" {\s\s} = \s\s (\d% full,\d% free) Status:\s',dev,sizestring,sizeunits,freestring,freeunits,100-freeper,freeper,diskstate)
- ENDIF
- ELSE
- StringF(output,'\d',free)
- ENDIF
-
- IF win=NIL
- WriteF('\s\b',output)
- ELSE
- SetWindowTitles(win,output,ver+5)
- ENDIF
- ENDPROC
-
- PROC percentage(amount,full)
- DEF ans
- ans:=Div(amount,Div(full,100))
- IF ans<0 THEN ans:=0
- IF ans>100 THEN ans:=100
- ENDPROC ans
-
- PROC doconversion(value,units)
- DEF bytescut
- /* Make it possible to set just Kbs and no other value */
- IF args[ARG_KILO]=TRUE THEN bytescut:=0 ELSE bytescut:=BYTESCUTOFF
-
- StrCopy(units,' bytes',ALL)
- IF args[ARG_BYTE]<>TRUE
- IF value>bytescut
- value:=Div(value,1024)
- StrCopy(units,'K',ALL)
- ENDIF
- IF args[ARG_KILO]<>TRUE
- IF ((value>KBYTESCUTOFF) AND (units[0]="K"))
- value:=Div(value,1024)
- StrCopy(units,'M',ALL)
- ENDIF
- ENDIF
- ENDIF
- ENDPROC value
-
- /* Gets the root directories name, i.e. the volume name, and places it */
- /* in the string specified in the brackets */
- PROC getdevname(devname)
- DEF lock, oldlock, fib:fileinfoblock
- /* If file does not exist, then prehaps it's a device without the */
- /* colon (:) */
- IF filethere(devname)=FALSE THEN StrAdd(devname,':',ALL)
- IF lock:=Lock(devname,SHARED_LOCK)
- REPEAT
- oldlock:=lock
- lock:=ParentDir(oldlock)
- Examine(oldlock,fib)
- UnLock(oldlock) /* Don't need it any more */
- UNTIL lock=NIL
- UnLock(lock)
- StrCopy(devname,fib.filename,ALL) /* Copy filename to the string */
- StrAdd(devname,':',ALL)
- ELSE
- WriteF('Could not get device name\n')
- ENDIF
- ENDPROC
-
- /* Convert a number to a string with comma's !!!!!! */
- /* Horribly messy code... but it works! */
- PROC commanumber(number,string)
- DEF out[12]:STRING, temp[12]:STRING,i, j, cc
- StringF(temp,'\d',number)
- j:=0
- cc:=-1 /* Comma Count */
- FOR i:=StrLen(temp)-1 TO 0 STEP -1
- INC cc
- IF cc>=3
- cc:=0
- out[j]:=","
- INC j
- ENDIF
- out[j]:=temp[i]
- INC j
- ENDFOR
- out[j]:=0 /* Null on the end */
-
- /* Reverse the string again.. */
- j:=0
- FOR i:=StrLen(out)-1 TO 0 STEP -1
- temp[j]:=out[i]
- INC j
- ENDFOR
- temp[j]:=0
- StrCopy(string,temp,ALL)
- ENDPROC string
-
- PROC filethere(file) HANDLE
- DEF lock=0
- lock:=Lock(file,ACCESS_READ)
- UnLock(lock)
- RETURN TRUE
- EXCEPT
- RETURN FALSE
- ENDPROC TRUE
-